#ifndef MEDIAANALYSIS_H
#define MEDIAANALYSIS_H

#include <QObject>
#include <FilePicker.h>
#include <QImage>
#include "FFString.h"

extern "C" {
    #include <libavformat/avformat.h>
    #include <libavcodec/avcodec.h>
}

enum MediaType {
    MEDIA_TYPE_UNKNOWN = -1,  ///< Usually treated as AVMEDIA_TYPE_DATA
    MEDIA_TYPE_VIDEO,
    MEDIA_TYPE_AUDIO,
    // MEDIA_TYPE_DATA,          ///< Opaque data information usually continuous
    // MEDIA_TYPE_SUBTITLE,
    // MEDIA_TYPE_ATTACHMENT,    ///< Opaque data information usually sparse
    // MEDIA_TYPE_NB
};

struct MediaInfo {
    //  文件类型
    enum MediaType mediaType;
    //  宽
    int width;
    //  高
    int height;
    //  格式
    QString format;
    //  时长
    int64_t duration;
    //  采样率 仅音频
    int sample_rate;
    //  通道数
    int channels;
    //  宽高比
    AVRational framerate;

    int frame_size;

    QList<AVStream *> audioStreams = QList<AVStream *>();

    AVStream * videoStream;

    unsigned int videoIndex;

    FFString description() {
        FFString str = FFString();
        switch (mediaType) {
        case MEDIA_TYPE_VIDEO:
            {
                str.append("视频文件").append(" ").append("宽：");
            str.appendInt(width);
            str.append("高：");
            str.appendInt(height);
            }
            break;
        case MEDIA_TYPE_AUDIO:
            {
                str.append("音频文件");
            }
            break;
        default:
            {
                str.append("非多媒体文件  ");
            }
            return str;
        }
        str.append(" 格式：").append(format).append(" 时长：");
        str.appendInt(duration);
        str.append(" 采样率：");
        str.appendInt(sample_rate);
        str.append(" 通道数：");
        str.appendInt(channels);
        str.append(" 音频数：");
        str.appendInt(audioStreams.size());
        return str;
    }

};

class MediaAnalysis : public QObject
{
    Q_OBJECT
public:
    explicit MediaAnalysis(QObject *parent = nullptr);

    MediaInfo analysisVideo(FileModel fileModel);

signals:
};

#endif // MEDIAANALYSIS_H

// //  编解码器的类型
// enum AVMediaType codec_type;
// //  编解码器的id
// enum AVCodecID   codec_id;
// //  编解码标签
// uint32_t         codec_tag;
// //  对于某些编码器（如H264），需要额外的信息来解码，这些信息被称为extradata，该成员变量保存了这些额外信息的地址
// uint8_t *extradata;
// //  extradata所占用的字节数
// int      extradata_size;
// AVPacketSideData *coded_side_data;
// int nb_coded_side_data;
// //  音视频帧的像素或采样格式，，例如对于视频来说，可以是AVPIXFMTYUV420P，AVPIXFMTNV12等。对于音频来说，可以是AVSAMPLEFMTS16，AVSAMPLEFMTFLTP等
// int format;
// //  平均比特率
// int64_t bit_rate;
// //  每个编码的样本所占用的位数
// int bits_per_coded_sample;
// //  每个采样的样本所占用的位数
// int bits_per_raw_sample;
// //  编解码器的配置类型
// int profile;
// //  编解码器的协议等级
// int level;
// //  每一帧的宽
// int width;
// //  每一帧的高
// int height;
// //  音视频帧宽高比
// AVRational sample_aspect_ratio;

// AVRational framerate;
// enum AVFieldOrder                  field_order;
// //  MPEG JPEG YUV范围
// enum AVColorRange                  color_range;
// enum AVColorPrimaries              color_primaries;
// enum AVColorTransferCharacteristic color_trc;
// //  YUV色彩空间类型
// enum AVColorSpace                  color_space;
// enum AVChromaLocation              chroma_location;
// //  播放器的编码时延
// int video_delay;
// AVChannelLayout ch_layout;
// //  采样率 仅音频
// int      sample_rate;
// int      block_align;
// int      frame_size;
// int initial_padding;
// int trailing_padding;
// //  如果需要进行关键帧的跳转，这个字段表示需要跳过的帧数
// int seek_preroll;
